2010-04-04 01:31:00
我原先不喜欢加 Log,后来我的头儿希望加 Log,于是乎我手头的项目就全是 Log 了。之前一直是定义一个不定参数的宏或者函数,遇到需要的地方就 LOG(...)。后来越来越感觉对于函数进出的信息比较渴求,于是弄了个固定的 LOG_FUNCTION() 来记录函数进入,因为有 __FUNCTION__ 嘛。
对于函数出口,原先一直是手写的,刚刚前几天在这里讨论的资源释放问题让我学到了新的解决方法——使用类似 Loki::ScopeGuard 的机制来输出函数退出。
晚上重新写了一下。见 http://code.google.com/p/xllog/。
使用如下:
1void bar()
2{
3 XL_LOG_FUNCTION();
4 XL_LOG(L"%s\n", L"In function bar.");
5}
6
7void foo()
8{
9 XL_LOG_FUNCTION();
10 XL_LOG(L"%s\n", L"In function foo.");
11
12 bar();
13}
14
15int main()
16{
17 XL_LOG_FUNCTION();
18
19 foo();
20
21 return 0;
22}
运行结果:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function main
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function foo
In function foo.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function bar
In function bar.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function bar
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function foo
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function main
基本功能我自己已经可以接受了。
有两点我想改进的,不知道能不能实现:
1、每个用到的函数写一句 XL_LOG_FUNCTION() 太麻烦了,而且有可能被用户写到任意地方,而非函数开始。有没有一种机制,使得可以写成类似(要保持函数定义的形式,不要把函数名括号括起来):
1void __log foo()
2{
3}
从而被展开成:
1void foo()
2{
3 XL_LOG_FUNCTION();
4}
呢?
或者有没有一种方法可以不用写任何东西就让每个函数体自动加上这么一句呢?
2、我想记录函数的调用层次。如果上面行能够实现的话,就没问题了,我可以自己记录函数进出次数。如果不能,那么依靠用户写 XL_LOG_FUNCTION() 来记录就不可靠了。有没有类似 __CALL_STACK_DEPTH__ 的预定义宏呢?
最后还有一个实际问题。实际使用中,在写代码的时候可能无法确定所写部位到底是偏底层还是偏上层。如果太偏底层而打了 Log,会输出很多 Log 干扰分析;如果太高层的而没打 Log,有可能遇到问题信息不足。这个问题该如何解决好呢?大家有没有成熟的解决思路呢?
首发:http://www.cppblog.com/Streamlet/archive/2010/04/04/111555.html